package com.hspedu.string;

public class StringExercise05 {
    public static void main(String[] args) {
        Person p1 = new Person();//p1 指向对象
        p1.name = "hspedu";
        Person p2 = new Person();
        p2.name = "hspedu";

        System.out.println(p1.name.equals(p2.name));//true 比较内容
        System.out.println(p1.name == p2.name);//true
        System.out.println(p1.name == "hspedu");//true "hspedu"相当于返回其在当前常量池中的地址

        String s1 = new String("bcde");
        String s2 = new String("bcde");
        System.out.println(s1 == s2);//false

        /**
         * 1. String是一个final类,代表不可变的字符序列
         * 2. 字符串是不可变的, 一个字符串对象一旦被分配, 其内容是不可变的
         * 看下面一行代码创建了几个对象 (2个常量对象)
         */
        String s = "hsp";
        s = "edu";

        /**
         * 1.编译器会做一个优化,判断创建的常量池对象,是否有引用指向
         * 2. String a1 = "hello" + "abc"; => String a1 = "helloabc";
         */
        String a1 = "hello" + "abc";//等价于 String a1 = "helloabc";

        /**
         * 1. 先创建一个StringBuilder sb = StringBuilder()
         * 2. 执行 sb.append("hello");
         * 3. sb.append("abc");
         * 4. String c = sb.toString()
         * 5. 最后其实是c指向堆中的对象(String) value[] 然后再指向 池中的"helloabc"
         *
         * 规则:
         * String c1 = "ab" + "cd"; 常量相加,看的是池.
         * String c1 = a + b; 变量相加,是在堆中
         */
        //以下代码创建了几个对象
        String a = "hello";//创建了a对象
        String b = "abc";//创建了b对象
        String c = a + b;//不等价于 String c = "hello" + "abc";
        String d = "helloabc";
        System.out.println(c == d);//false
    }
}

class Person{
    public String name;
}
